package beans.cadastro.operacional;

import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.faces.component.UICommand;
import javax.persistence.EntityExistsException;
import javax.persistence.Query;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import org.ajax4jsf.component.html.HtmlAjaxCommandButton;
import pojo.cadastro.operacional.Estoque;
import pojo.cadastro.operacional.Marca;
import pojo.cadastro.operacional.Produto;

public class ProdutoBean {

    @PersistenceContext
    private EntityManager mgr;
    
    // pojo
    private long id;
    private String descricao;
    private double valorCompra;
    private double valorVenda;
    private String tamanho;
    private String marcaId;
    private String marcaDescricao;
    private String marcaDescricaoPesq;

    // Campos de Pesquisa
    private String descricaoPesq;

    // listas
    private List<Produto> listaProdutos;
    private List<Marca> listaMarcas;

    // botoes de comandos
    private UICommand btnAlterar;
    private UICommand btnExcluir;
    private HtmlAjaxCommandButton btnSelecionar;

    public ProdutoBean() {
        listaProdutos = Collections.EMPTY_LIST;
    }

    public String pesquisar() {
        carregar();
        return "pesquisa";
    }

    public String retornar() {
        return "pesquisa";
    }

    public String carregar() {

        listaProdutos = Collections.EMPTY_LIST;
        String sql = "SELECT p FROM Produto p WHERE p.id IS NOT NULL ";
        if (!this.descricaoPesq.equals(""))
            sql += "AND p.descricao LIKE :descricaoPesq ";
        sql += "ORDER BY p.descricao";

        mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
        Query q1 = mgr.createQuery(sql);

        if (!this.descricaoPesq.equals(""))
            q1.setParameter("descricaoPesq", "%"+this.descricaoPesq+"%");

        listaProdutos = q1.getResultList();
        mgr.close();

        return null;
    }

    public String salvar() {
        Produto p = new Produto();

        if (id != 0) {
            p.setId(id);
        }

        p.setDescricao(this.descricao);
        p.setValorCompra(valorCompra);
        p.setValorVenda(valorVenda);
        p.setTamanho(tamanho);
        Marca m = new Marca();
        m.setId(Long.parseLong(marcaId));
        p.setMarca(m);

        p.setDataCadastro(new Date(System.currentTimeMillis()));

        mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
        mgr.getTransaction().begin();
        try {
            if (p.getId() == 0) {
                Estoque e = new Estoque();
                e.setProduto(p);
                e.setQuantidade(0);
                e.setDataUltimaAlteracao(new Date(System.currentTimeMillis()));
                p.setEstoque(e);

                mgr.persist(p);
            } else {
                Estoque e = (Estoque) mgr.createNamedQuery("Estoque.getByProduto").setParameter("produtoId", p.getId()).getSingleResult();
                e.setProduto(p);
                p.setEstoque(e);
                
                mgr.merge(p);
            }
            mgr.getTransaction().commit();
        } catch (EntityExistsException e) {
            mgr.getTransaction().rollback();
        } finally {
            mgr.close();
        }

        listaProdutos = Collections.EMPTY_LIST;

        return "pesquisa";
    }

    public String incluir() {
        id = 0;
        descricao = "";
        valorCompra = 0;
        valorVenda = 0;
        tamanho = "";
        marcaId = "";
        marcaDescricao = "";
        marcaDescricaoPesq = "";

        return "cadastro";
    }

    public String alterar() {
        mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
        Produto p = mgr.find(Produto.class, Long.parseLong(btnAlterar.getValue().toString()));

        id = p.getId();
        descricao = p.getDescricao();
        valorCompra = p.getValorCompra();
        valorVenda = p.getValorVenda();
        tamanho = p.getTamanho();
        marcaId = String.valueOf(p.getMarca().getId());
        marcaDescricao = String.valueOf(p.getMarca().getId())+" - "+p.getMarca().getDescricao();

        return "cadastro";
    }

    public String excluir() {
        mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
        Produto p = mgr.find(Produto.class, Long.parseLong(btnExcluir.getValue().toString()));

        mgr.getTransaction().begin();
        try {
            mgr.remove(p);
            mgr.getTransaction().commit();
        } catch (Exception e) {
            mgr.getTransaction().rollback();
        } finally {
            mgr.close();
        }
        carregar();

        return null;
    }

    // Pesquisa de Marca
    public String pesquisarMarca() {
        mgr = Persistence.createEntityManagerFactory("lojaPU").createEntityManager();
        Query q1 = mgr.createNamedQuery("Marca.queryByDescricao");
        q1.setParameter("descricaoPesq", "%"+marcaDescricaoPesq+"%");
        this.listaMarcas = q1.getResultList();
        return null;
    }

    public String selecionarMarca() {
        String valor[] = btnSelecionar.getValue().toString().split(",");
        marcaId = valor[0];
        marcaDescricao = valor[0]+" - "+valor[1];
        return null;
    }

    // Getters and Setters


    public UICommand getBtnAlterar() {
        return btnAlterar;
    }

    public void setBtnAlterar(UICommand btnAlterar) {
        this.btnAlterar = btnAlterar;
    }

    public UICommand getBtnExcluir() {
        return btnExcluir;
    }

    public void setBtnExcluir(UICommand btnExcluir) {
        this.btnExcluir = btnExcluir;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String getDescricaoPesq() {
        return descricaoPesq;
    }

    public void setDescricaoPesq(String descricaoPesq) {
        this.descricaoPesq = descricaoPesq;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public List<Produto> getListaProdutos() {
        return listaProdutos;
    }

    public void setListaProdutos(List<Produto> listaProdutos) {
        this.listaProdutos = listaProdutos;
    }

    public String getTamanho() {
        return tamanho;
    }

    public void setTamanho(String tamanho) {
        this.tamanho = tamanho;
    }

    public double getValorCompra() {
        return valorCompra;
    }

    public void setValorCompra(double valorCompra) {
        this.valorCompra = valorCompra;
    }

    public double getValorVenda() {
        return valorVenda;
    }

    public void setValorVenda(double valorVenda) {
        this.valorVenda = valorVenda;
    }

    public String getMarcaDescricao() {
        return marcaDescricao;
    }

    public void setMarcaDescricao(String marcaDescricao) {
        this.marcaDescricao = marcaDescricao;
    }

    public String getMarcaId() {
        return marcaId;
    }

    public void setMarcaId(String marcaId) {
        this.marcaId = marcaId;
    }

    public List<Marca> getListaMarcas() {
        return listaMarcas;
    }

    public void setListaMarcas(List<Marca> listaMarcas) {
        this.listaMarcas = listaMarcas;
    }

    public HtmlAjaxCommandButton getBtnSelecionar() {
        return btnSelecionar;
    }

    public void setBtnSelecionar(HtmlAjaxCommandButton btnSelecionar) {
        this.btnSelecionar = btnSelecionar;
    }

    public String getMarcaDescricaoPesq() {
        return marcaDescricaoPesq;
    }

    public void setMarcaDescricaoPesq(String marcaDescricaoPesq) {
        this.marcaDescricaoPesq = marcaDescricaoPesq;
    }

}